
#ifndef __TTUSB_H_
#define __TTUSB_H_

/**/
#define XFER_MAX   256

// typedef int (* bulk_in_req_cbk)( void * parg, uint8_t * ptr, int tmax );
typedef int (* bulk_proc_cbk)( void * parg, uint8_t * ptr, int tsiz );

typedef void (* trans_end_cbk)( void );

typedef struct _tag_xfer_context {

    /* current stage.. */
    int  stg;
    usb_setup_packet_t * pkt;

    /* data stage, buffer. */
    int  pid;
    int  max;
    int  ofs;
    uint8_t buf[XFER_MAX];

    /* todo : setup trans end, cbk function */
    trans_end_cbk  cbkf;

} xfer_context;



typedef struct _tag_usbd_intf {

    char * str_intf;

    void * pctx;
    
    /**/
    int epcnt;
    uint8_t  epadrs[8];

} usbd_intf_t;


typedef struct _tag_usbd_endp
{
    usbd_intf_t * pifc;

    int  pid;
    bulk_proc_cbk  pfunc;

} usbd_endp_t;


typedef struct _tag_usbd_config {
    
    /***** device */
    uint16_t vid;
    uint16_t pid;
    
    char * str_manu;
    char * str_prod;
    char * str_seri;

    /***** config */
    char * str_cnfg;
    uint8_t maxpower;

    /***** interface */
    usbd_intf_t  iface[1];

    /***** end points **/
    int  used;
    usbd_endp_t  endps[15];

}  usbd_config_t;



typedef struct _tag_usbd_context {

	usbd_config_t ucfg;			/* desc, config */

	xfer_context  uxfer;		/* xfer, setup proc */
	
} usbd_context_t;


/*
实现约束:
(a) 仅仅支持 1 个interface.
(c) 所有的 endp 仅仅支持 bulk 通信协议.
(b) 支持定时协议类型, 通过 winusb 的接口来开发.
*/


/* config: device */
int ttusb_desc_device_vid_pid( uint16_t vid, uint16_t pid );
int ttusb_desc_device_str_manu( char * str );
int ttusb_desc_device_str_prod( char * str );
int ttusb_desc_device_str_seri( char * str );

/**/
int ttusb_desc_config_str( char * str );
int ttusb_desc_config_power( uint8_t pwr );

/* config: interface, endpoint */
int ttusb_desc_interface_str( char * str );
int ttusb_desc_interface_add_inp( bulk_proc_cbk cbkf );
int ttusb_desc_interface_add_outp( bulk_proc_cbk cbkf );

/**/
int ttusb_desc_init( void );
int ttusb_init( void );

/* send data to host (IN endp ) */
int ttusb_intf_send( usbd_intf_t * pifc, int idx, int tlen, void * pdat );

#endif


